package com.bj.rd.cs;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.bj.rd.entity.Student;
import com.bj.rd.session.HibernateSessionFactory;
/**
 * @desc   Hibernate--二级缓存
 * @author wyh
 * @time   2016-08-24
 *
 */
public class TestEcache  {
	public static void main(String[] args) {
		

		// 1.加载配置文件
		Configuration config = new Configuration().configure();
		// 2.创建session工厂
		SessionFactory sessionFactory = config.buildSessionFactory();
		// 3.获取session
		Session session = sessionFactory.openSession();
		// 4.开启事务
		Transaction transaction = session.beginTransaction();
		// 5.进行持久化操作(CRUD)
		
		/**
		 * hibernate中get()和load()方法默认是支持使用二级缓存的，所以当我们查询一条数据的时候
		 * 如果是按照下面的写法配置上了Hibernate的二级缓存那么结果就是只有一条sql语句
		 * 
		 * **/
		 Student stu = (Student) session.get(Student.class, "001");//从数据库获取  
		 System.out.println(stu);
		 Student stu2 = (Student) session.get(Student.class, "001"); //从缓存中 
		 System.out.println(stu2);
		 /**
		  * 因为HIbernate默认是将缓存自动从一级缓存复制到二级缓存，所以为了演示方便我们将一级和二级缓存都给清空，这样我们就会发现会重新执行sql语句了
		 
		 session.evict(stu2);
		 sessionFactory.evict(stu2.getClass());  
		 
		 Student stu3 = (Student) session.get(Student.class,"001"); //从缓存中 
		 System.out.println(stu3);   */
		 
		 
		 
		 
		 
		 /**
		  * hibernate中Query接口是默认不直接使用二级缓存的，所以当不执行第59行的时候结果就是三条sql语句，反之是一条*/
		  
		  Query query = session.createQuery("from Student");
		  query.setCacheable(true);//手动开启二级缓存  
		  List list = query.list();
		  System.out.println(list.size());
		  List list2 = query.list();
		  System.out.println(list2.size());
		  List list3 = query.list();
		  System.out.println(list3.size());
		
		// 6.提交事务
		transaction.commit();
		// 7.关闭连接
		session.close();

		
		
	}
	}
